Prevent rustc stderr/stdout from being duplicated.
authorMark Simulacrum <mark.simulacrum@gmail.com>
Mon, 26 Jun 2017 23:07:36 +0000 (17:07 -0600)
committerMark Simulacrum <mark.simulacrum@gmail.com>
Tue, 27 Jun 2017 00:37:26 +0000 (18:37 -0600)
src/cargo/ops/cargo_rustc/custom_build.rs
src/cargo/ops/cargo_rustc/mod.rs
src/cargo/util/process_builder.rs
tests/build.rs

index 15c149bcc14d6144b568e00e248e7987100f7368..c53fc612e62ce1f240945a0b1008fd3c836ad55a 100644 (file)
@@ -244,6 +244,7 @@ fn build_work<'a, 'cfg>(cx: &mut Context<'a, 'cfg>, unit: &Unit<'a>)
         let output = cmd.exec_with_streaming(
             &mut |out_line| { state.stdout(out_line); Ok(()) },
             &mut |err_line| { state.stderr(err_line); Ok(()) },
+            true,
         ).map_err(|e| {
             CargoError::from(
                 format!("failed to run custom build command for `{}`\n{}",
index 67bb834a271ab4372968247d05dc61105dca3960..6e83c04a9bd3aebdfa55a55b68d58b89c3653c43 100644 (file)
@@ -80,7 +80,7 @@ pub trait Executor: Send + Sync + 'static {
                  handle_stdout: &mut FnMut(&str) -> CargoResult<()>,
                  handle_stderr: &mut FnMut(&str) -> CargoResult<()>)
                  -> CargoResult<()> {
-        cmd.exec_with_streaming(handle_stdout, handle_stderr)?;
+        cmd.exec_with_streaming(handle_stdout, handle_stderr, false)?;
         Ok(())
     }
 }
index 5f8021d11bb30a66bdcabb9288a61d58e17c33bd..6386be9de3e22c7726f123ca11c0352b1c2466b0 100644 (file)
@@ -135,7 +135,8 @@ impl ProcessBuilder {
 
     pub fn exec_with_streaming(&self,
                                on_stdout_line: &mut FnMut(&str) -> CargoResult<()>,
-                               on_stderr_line: &mut FnMut(&str) -> CargoResult<()>)
+                               on_stderr_line: &mut FnMut(&str) -> CargoResult<()>,
+                               print_output: bool)
                                -> CargoResult<Output> {
         let mut stdout = Vec::new();
         let mut stderr = Vec::new();
@@ -187,18 +188,26 @@ impl ProcessBuilder {
             stderr: stderr,
             status: status,
         };
-        if !output.status.success() {
-            Err(CargoErrorKind::ProcessErrorKind(process_error(
-                &format!("process didn't exit successfully: `{}`", self.debug_string()),
-                Some(&output.status), Some(&output))).into())
-        } else if let Some(e) = callback_error {
-            Err(CargoError::with_chain(e,
-                CargoErrorKind::ProcessErrorKind(process_error(
-                    &format!("failed to parse process output: `{}`", self.debug_string()),
-                    Some(&output.status), Some(&output)))))
-        } else {
-            Ok(output)
+
+        {
+            let to_print = if print_output {
+                Some(&output)
+            } else {
+                None
+            };
+            if !output.status.success() {
+                return Err(CargoErrorKind::ProcessErrorKind(process_error(
+                            &format!("process didn't exit successfully: `{}`", self.debug_string()),
+                            Some(&output.status), to_print)).into())
+            } else if let Some(e) = callback_error {
+                return Err(CargoError::with_chain(e,
+                        CargoErrorKind::ProcessErrorKind(process_error(
+                                &format!("failed to parse process output: `{}`", self.debug_string()),
+                                Some(&output.status), to_print))))
+            }
         }
+
+        Ok(output)
     }
 
     pub fn build_command(&self) -> Command {
index f2081c61fa3edb68d8d85f7eaf0800d7c129abf4..d510e5b2949e86be6f3a9236aa45f52bd4afcdec 100644 (file)
@@ -29,6 +29,16 @@ fn cargo_compile_simple() {
                 execs().with_status(0).with_stdout("i am foo\n"));
 }
 
+#[test]
+fn cargo_fail_with_no_stderr() {
+    let p = project("foo")
+        .file("Cargo.toml", &basic_bin_manifest("foo"))
+        .file("src/foo.rs", &String::from("refusal"));
+    let p = p.build();
+    assert_that(p.cargo("build").arg("--message-format=json"), execs().with_status(101)
+        .with_stderr_does_not_contain("--- stderr"));
+}
+
 /// Check that the `CARGO_INCREMENTAL` environment variable results in
 /// `rustc` getting `-Zincremental` passed to it.
 #[test]